﻿using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Maestro_Proveedores.evaluacionDeDesempeno.indicadores
{
    /// <remarks>
    /// Esta clase abstrae los conceptos y operaciones que debe realizar un indicador.
    /// </remarks>
    abstract public class Indicador
    {        
        protected Indicador()
        {}        
        //--- esta variable guarda el resultado final del indicador(suponiendo que se retorne un valor numerico)...
        private double resultado = 0;
        //--- esta variable guarda la evalucion final del indicador (100%, 75%, 50% ò 25%)
        private double porcentajeEvaluacion = 0;
        //--- esta variable guarda el peso o ponderado del indicador
        private double peso = 0;
        private DateTime fechaInferior;
        private DateTime fechaSuperior;

        private Enums.TipoIndicador tipoIndicador;
        protected _Maestro_Proveedores_CORPORATIVADataSet.CONSULTA_proveedoresRow registroProveedor = null;        
        
        protected abstract bool calcular();
        /// <summary>
        /// calcular el resultado del indicador para un proveedor determinado, dentro de un rango de fechas.
        /// </summary>
        /// <param name="row">Registro proveedor(DataSet.Maestro_Proveedores.CORPORATIVADataSet.CONSULTA_proveedoresRow)</param>
        /// <param name="fechaInferior">Fecha minima</param>
        /// <param name="fechaSuperior">Fecha Maxima</param>
        /// <returns>Resultado de la evaluación, si el resultado es -1, entonces el indicador no pudo ser calculado correctamente</returns>
        public double calcularByFechas(_Maestro_Proveedores_CORPORATIVADataSet.CONSULTA_proveedoresRow row, DateTime fechaInferior, DateTime fechaSuperior)
        {    
            this.FechaInferior = fechaInferior;
            this.FechaSuperior = fechaSuperior;
            this.registroProveedor = row;
            //System.Windows.Forms.MessageBox.Show(this.calcular().ToString());
            if (this.calcular())
            {
                return this.PorcentajeEvaluacion * this.Peso;
            }
            else
            {
                return -1;
            }
            
        }
        
//--- propiedades
        /// <summary>
        /// Obtiene o establece puntaje final del proveedor en este indice, para mayor informacion consultar el proyecto: DISEÑO E IMPLEMENTACIÓN DEL PROCESO DE CALIFICACIÓN,EVALUACIÓN, DESARROLLO Y CERTIFICACIÓN DE PROVEEDORES DE COTECMAR
        /// </summary>
        public double PorcentajeEvaluacion
        {
            get { return porcentajeEvaluacion; }
            set { porcentajeEvaluacion = value; }
        }
        /// <summary>
        /// Obtiene o establece la fecha maxima con la que trabajara este indicador.
        /// </summary>
        public DateTime FechaSuperior
        {
            get { return fechaSuperior; }
            set { fechaSuperior = value; }
        }
        /// <summary>
        /// Obtiene o establece la fecha minima con la que trabajara este indicador.
        /// </summary>
        public DateTime FechaInferior
        {
            get { return fechaInferior; }
            set { fechaInferior = value; }
        }
        /// <summary>
        /// Obtiene o establece el resultado final de la evalucion (Ejemplo: dias de diferencia, porcentaje de faltantes, total de llamados, etc), este resultado depende de la definicion de cada indicador.
        /// </summary>
        public double Resultado
        {
            get { return resultado; }
            set { resultado = value; }
        }
        /// <summary>
        /// Obtiene o establece el tipo del indicador, para mayor información puede consultar el Enum TipoIndicador.
        /// </summary>
        public Enums.TipoIndicador TipoIndicador
        {
            get { return tipoIndicador; }
            set { tipoIndicador = value; }
        }
        /// <summary>
        /// Obtiene o establece el peso ponderado del indicador, para mayor informacion consultar el proyecto: DISEÑO E IMPLEMENTACIÓN DEL PROCESO DE CALIFICACIÓN,EVALUACIÓN, DESARROLLO Y CERTIFICACIÓN DE PROVEEDORES DE COTECMAR.
        /// </summary>
        public double Peso
        {
            get { return peso; }
            set { peso = value; }
        }
    }
}

